package mx.mxgamer;

import mx.bd.BDManager;
import mx.beans.Console;
import mx.files.FileManager;
import mx.fragments.GameDetailFragment;
import mx.fragments.GameListFragment;
import mx.fragments.SelectedGameListener;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import android.os.Build;
import android.os.Bundle;
import android.provider.MediaStore;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.util.Log;
import android.view.Menu;
import android.widget.ImageView;
import android.widget.Toast;

public class MXGamer extends FragmentActivity implements SelectedGameListener {

	private SQLiteDatabase sqldb;
	private static Context context;

	/** TESTING **/
	String archivoImagen = "prueba.jpg";
	int image_request_code = 1;
	ImageView imagenParaColocarFotoYVerQueTodoFuncioneChido;

	private void dispatchTakePictureIntent(int actionCode) {
		Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
		startActivityForResult(takePictureIntent, actionCode);
	}

	private Bitmap handleSmallCameraPhoto(Intent intent) {
		Bundle extras = intent.getExtras();
		return (Bitmap) extras.get("data");
	}

	@SuppressLint("ShowToast")
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {

		if (requestCode == image_request_code && resultCode == RESULT_OK) {

			FileManager.saveImage(handleSmallCameraPhoto(data), archivoImagen);

		} else {
			Toast.makeText(this, "IMAGEN CANCELADA", Toast.LENGTH_SHORT).show();
		}
		super.onActivityResult(requestCode, resultCode, data);
	}

	/** TESTING **/

	// /////////////////////////////////////////////////////////////////////////
	/*
	 * VARIABLES LOCALES AL IDIOMA (para selección dinámica y despliegue
	 * estático)
	 */
	// /////////////////////////////////////////////////////////////////////////

	public static String UPDATE_MSG_OK;
	public static String UPDATE_MSG_FAIL;
	public static String CREATE_MSG_OK;
	public static String CREATE_MSG_FAIL;
	public static String DELETE_MSG_OK;
	public static String DELETE_MSG_FAIL;

	// /////////////////////////////////////////////////////////////////////////
	/*
	 * CICLO DE VIDA
	 */
	// /////////////////////////////////////////////////////////////////////////

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_mxgamer);

		checkUI(savedInstanceState);
		logSystemProperties();

		initExtras();
		initBD();
		initTexts();

		/*** TESTING ***/
		testRuiz();
		testVic();
		/*** TESTING ***/
	}

	@Override
	protected void onStart() {
		super.onStart();

	}

	@Override
	protected void onResume() {
		super.onResume();

	}

	@Override
	protected void onPause() {
		super.onPause();

	}

	@Override
	protected void onRestart() {
		super.onRestart();

	}

	@Override
	protected void onStop() {
		super.onStop();

	}

	@Override
	protected void onDestroy() {
		super.onDestroy();

	}

	// /////////////////////////////////////////////////////////////////////////
	/*
	 * FRAGMENTOS
	 */
	// /////////////////////////////////////////////////////////////////////////

	/**
	 * Revisamos la configuración para cargar layout de tablets o handsets
	 */
	private void checkUI(Bundle savedInstanceState) {
		// Checamos si la actividad usa el layout de fragmentos
		if (findViewById(R.id.contenedor_fragment) != null) {

			// Revisamos si nos recuperamos de un estado previamente almacenado
			// (si es cierto, podríamos encimar los fragmentos y no se quiere
			// eso)
			if (savedInstanceState != null) {
				return;
			}

			// Creamos los fragmentos
			GameListFragment listFragment = new GameListFragment();

			// Pasamos los argumentos "extras" (por si un intento inicializó
			// esto con instrucciones especiales)
			listFragment.setArguments(getIntent().getExtras());

			// Utilizamos el framework para utilizar los fragmentos.
			// Siempre son variables locales.
			FragmentTransaction fragmentTransaction = getSupportFragmentManager()
					.beginTransaction();
			fragmentTransaction.add(R.id.contenedor_fragment, listFragment);
			fragmentTransaction.commit();

		}// if ( fragment_container )

	}

	/**
	 * Aquí ya cachamos el evento de que se picó algo del fragmento de lista de
	 * juegos Diferenciamos las llamadas para HANDSET o TABLET
	 */
	public void onGameSelectedListener(int position) {
		// Aqui el usuario ya seleccionó algo del fragmento (lista de juegos)

		FragmentManager fragmentManager = getSupportFragmentManager();
		GameDetailFragment detailFragment = (GameDetailFragment) fragmentManager
				.findFragmentById(R.id.detallejuegos_fragment);

		// Estamos en una pantalla grande. (TABLET)
		if (detailFragment != null) {

			// Llamamos su método de actualización
			detailFragment.updateGame(position);

		} else { // Estamos en un (HANDSET)

			// Creamos el ejemplar y pasamos los argumentos
			GameDetailFragment newDetailFragment = new GameDetailFragment();
			Bundle args = new Bundle();

			args.putInt(GameDetailFragment.CURRENT_GAME, position);
			newDetailFragment.setArguments(args);

			// Hacemos un swap a este ejemplar
			FragmentTransaction fragmentTransaction = fragmentManager
					.beginTransaction();

			fragmentTransaction.replace(R.id.contenedor_fragment,
					newDetailFragment);
			fragmentTransaction.addToBackStack(null); // Para que sirva el boton
														// de back

			fragmentTransaction.commit();

		}

	}

	// /////////////////////////////////////////////////////////////////////////
	/*
	 * MENUS
	 */
	// /////////////////////////////////////////////////////////////////////////

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.activity_mxgamer, menu);
		return true;
	}

	// /////////////////////////////////////////////////////////////////////////
	/*
	 * EXTRAS
	 */
	// /////////////////////////////////////////////////////////////////////////

	/**
	 * Inicializa los componentes de Base de Datos.
	 */
	private void initBD() {
		BDManager.initBDManager(getApplicationContext());
		sqldb = BDManager.getDataBase();
		Console.initializeConsole(sqldb);
	}

	/**
	 * Método para probar y debuguear Rodrigo
	 */
	private void testRuiz() {

	}

	/**
	 * Método para probar y debuggear Victor
	 */
	private void testVic() {
		String tag = "TEST";
		Log.d(tag, "INICIA TESTING");

		imagenParaColocarFotoYVerQueTodoFuncioneChido = (ImageView) findViewById(R.id.imageViewTest);
		// long idnuevo = BDManager.getImageID("nueva.png");
		// Log.i("NUEVA", "[" + idnuevo + "]");
		//
		// // CUIDADO AL CREAR NUEVAS CON EL CONSTRUCTOR DE CADENA SOLITO.
		// (TRUENA)
		// Image nueva = new Image(-1,"nueva.png");
		// nueva.create(1);
		//
		// Log.i("IMAGEN: ", nueva.toString());
		//
		// //nueva.setUri("otra_imagen.png");
		// //nueva.update();
		//
		// Log.i("IMAGEN: ", nueva.toString());
		//
		// // NO TENGO IDEA DE PORQUE NO CACHA MIS EXCEPCIONES.
		// // LAS LANZO PORQUE SI YA ESTÁ HAGO ROLLBACK EN BD

		// FALTA PROBAR VIDEO Y GAME.

		Bitmap nuevo = FileManager.retrieveImage(archivoImagen);
		if (nuevo != null)
			imagenParaColocarFotoYVerQueTodoFuncioneChido.setImageBitmap(nuevo);

		//dispatchTakePictureIntent(image_request_code);

		Log.d(tag, "FINALIZA TESTING");
	}

	/**
	 * Para considerar al momento del deploy:
	 */
	private void logSystemProperties() {
		String locale = getResources().getConfiguration().locale
				.getDisplayName();
		Log.d("___", "___");
		Log.i("LOCALE", locale);

		Log.i("ANDROID VERSION", "[" + Build.VERSION.SDK_INT + "]");
		Log.i("MANUFACTURER", Build.MANUFACTURER);
		Log.i("BRAND", Build.BRAND);
		Log.i("DEVICE", Build.DEVICE);
		Log.i("DISPLAY", Build.DISPLAY);
		Log.i("HARDWARE", Build.HARDWARE);
		Log.i("MODEL", Build.MODEL);
		Log.i("PRODUCT", Build.PRODUCT);
		Log.i("BOARD", Build.BOARD);
	}

	/**
	 * Inicializa los textos de acuerdo al idioma
	 */
	private void initTexts() {
		UPDATE_MSG_OK = getString(R.string.task_update_ok);
		UPDATE_MSG_FAIL = getString(R.string.task_update_fail);
		CREATE_MSG_OK = getString(R.string.task_create_ok);
		CREATE_MSG_FAIL = getString(R.string.task_create_fail);
		DELETE_MSG_OK = getString(R.string.task_delete_ok);
		DELETE_MSG_FAIL = getString(R.string.task_delete_fail);
	}

	/**
	 * En la clase, colocamos el contexto para que se puedan desplegar mensajes
	 */
	private void initExtras() {
		MXGamer.context = getApplicationContext();
	}

	/**
	 * Genérico para desplegar los mensajes
	 */
	public static void toastMessage(String message) {
		Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
	}

}// MXGAMER
